# -*- coding:utf-8 -*-
#encoding: utf-8

from flask import Flask,redirect,url_for,render_template,request
import config
from flask_sqlalchemy import SQLAlchemy

#初始化一个flask的对象，Flask()
#传递一个参数 __name__,参数方便flask去寻找资源，出错的时候，进行问题定位
app = Flask(__name__)
#调用config文件
app.config.from_object(config)
#初始化数据库
db = SQLAlchemy(app)
# db.create_all()
'''
'''

# @app.routes 是一个装饰器
# @开头，并在函数上，说明是函数的装饰器，也就是路由，转发使用
# 装饰器的作用：做一个url与视图函数的映射
# 访问 http://127.0.0.1:5000/ 的时候，系统会请求hello_world() 函数，并把结果返回给浏览器

#反转url：从视图函数到url的转换，叫做 反转url，使用url_for方法，方法中加入函数的名称作为参数
#反转url使用：在模板或是需要跳转的时候可能会用到
@app.route('/')
def hello_world():

    #url反转
    redi_url = url_for('redi')
    #重定向
    return redirect(redi_url)
    # return 'Hello World!--第一个flask---'

#url传参数的作用，根据不同的参数，加载不同的数据
#在flask中使用参数： 如下方的 article 方法的调用
# # 参数必须放在 <>中
@app.route('/article/<id>')
def article(id):
    return u'您输入的id为：%s' % id

@app.route('/redi')
def redi():
    #url反转
    return 'Hello World!--进行跳转flask---'

#html渲染，使用,基础的使用方法就是直接传入参数
@app.route('/htmltest/')
def htmltest():
    return render_template('index1.html',username = u'动态传入-哈哈',age = '18',xb = u'男')

#html渲染，使用字典表 dict的模式进行传入,在模板中使用变量的语法为 {{参数名称}}
@app.route('/htmldict')
def htmldict():
    context = {'username':u'动态传入-哈哈','age':'18','xb':u'男女'}
    return render_template('index_dict.html',**context)

#在html中访问模型的属性，object属性
    '''
    访问模型中的属性可以使用persion.xb 方式进行访问，也可以使用web_url['google'] 方式进行访问
    '''
@app.route('/htmlObject')
def htmlObject():
    class persion(object):
        name = u'动态传入-object类型'
        age = '18'
        xb = u'未知'
    p = persion()

    context = {'username':u'动态传入-哈哈','age':'18','xb':u'男女','persion':p,
               'web_url':{'baidu':'www.baidu.com','google':'www.google.com.cn'}}

    return render_template('index_object.html',**context)

#if 条件语句使用
    '''
    html使用方法：
    {% if ***%}
    {% endif %}
    '''
@app.route('/if_method/<is_true>/')
def if_method(is_true):
    context = {'username': u'动态传入-哈哈', 'age': '18', 'xb': u'男女'}
    if is_true == '1':

        user= {'username':u'当前已登录','age':118}
        return render_template('if_method.html', user = user,**context)
    else:
        return render_template('if_method.html',**context)

#for 循环语句
    '''
    1、字典表的遍历可以使用‘items（）’，‘keys()’、‘values()’,'iteritems()','itemkeys()','itemvalues()'
        {% for key,value in user.items() %}
            <p>{{  key}}:{{  value}}</p>
        {% endfor %}
    2、列表的遍历：语法和Python是一样的
        {% for website in website_list %}
            <p>进行列表循环，当前的列表值为：{{ website_list }}</p>
        {% endfor %}
    '''
@app.route('/for_method/')
def for_method():
    context = {'username': u'动态传入-哈哈', 'age': '18', 'xb': u'男女'}
    user = {'username': u'for循环的基础使用方法', 'age': 118}
    website_list = ['www.baidu.com','www.google.com']
    return render_template('for_method.html',user = user,website_list = website_list,**context)

#for的一个实例，前台显示四大名著信息
@app.route('/for_instances/')
def for_instances():
    books = [{'name':u'水浒传','author':u'施耐庵','price':109},{'name':u'红楼梦','author':u'曹雪芹','price':109},{'name': u'三国演义hhhhhh', 'author': u'罗贯中', 'price': 109},{'name':u'西游记','author':u'吴承恩','price':109}]
    return render_template('for_instances.html',books = books)

#过滤器的使用 filter
    '''
    主要是在未传入默认值的情况下，给一个默认的内容
    <img src="{{ image_url | default('http://192.168.101.8:8080/MediaRoot/rec/20180110/1442/3e61b92b-4b2c-41cd-b5e0-d171028d9fe0/20180109104540.jpg')}}">
    过滤器 length，主要是对传入的参数求长度
    '''
@app.route('/filter_method/')
def filter_method():
    image_url = 'http://192.168.101.8:8080/MediaRoot/rec/20180110/1442/87dc88af-7081-4abd-9d3c-27f991c19294/20180109152627.jpg'
    comments = [{'user':u'第一个参数','context':u'第一个参数的内容'},{'user':u'第二个参数','context':u'第二个参数的内容'}]
    return render_template('filter_method.html',comments = comments)

#flask的继承相关
@app.route('/extends_method/')
def extends_method():
    return render_template('extends_basic.html')
    '''
    模板继承使用的方法：{% extends 'extends_basic.html' %}
    模板中加入：{% block main %}{% endblock %}
    继承模板的内容写入 block中
    {% block main %}
        <h1>这个是继承模板来的内容</h1>
    {% endblock %}
    '''
@app.route('/extends_down/')
def extends_down():
    return render_template('extends_index.html')

#url跳转
''''
使用 <a href="{{ url_for('url_render') }}">url点击跳转</a> 方法可以进行页面的跳转
'''
@app.route('/url_render/')
def url_render():
    return render_template('extends_index.html')

#flask_sqlalchemy进行模型映射
'''
继承数据库的Module
class Interface_test(db.Model):
    __tablename__ = 'Interface_test'
    interface_group_id = db.Column(db.INTEGER,primary_key=True,autoincrement=True)
    interface_group_name = db.Column(db.String(100),nullable=False)
    interface_group_path = db.Column(db.TEXT)
    interface_group_file = db.Column(db.String(100),nullable=False)
db.create_all() ---使用db.create_all()执行数据库操作
'''
class Interface_test(db.Model):
    __tablename__ = 'Interface_test'
    interface_group_id = db.Column(db.INTEGER,primary_key=True,autoincrement=True)
    interface_group_name = db.Column(db.String(100),nullable=False)
    interface_group_path = db.Column(db.TEXT)
    interface_group_file = db.Column(db.String(100),nullable=False)
db.create_all()

#数据库操作--插入数据
@app.route('/db_add_data/')
def db_add_data():
    #增加：先实例化一个对象Interface_test()
    Interface_test_data01 = Interface_test(interface_group_name=u'login',interface_group_file='login_module')
    #使用session进行事务创建
    db.session.add(Interface_test_data01)
    #进行事务提交
    db.session.commit()
    return u'添加成功'

#进行数据库查询操作
'''
查询使用 类名.query.filter进行查询，查到的结果是 class，可以使用class进行操作
'''
@app.route('/db_query/')
def db_query():
    result = Interface_test.query.filter(Interface_test.interface_group_name == 'login')
    result_all = Interface_test.query.filter().first()
    session_query_result = db.session.query(Interface_test).all()
    Interface_test_result = result[0]
    result_all_data = result_all
    print result
    print result_all.interface_group_file
    print result_all
    print 'interface_group_name:%s'% Interface_test_result.interface_group_name
    print 'interface_group_file:%s'% Interface_test_result.interface_group_file
    print '-----------------------'
    print (db.session.query(Interface_test).all())
    print session_query_result
    for session_query in session_query_result:
        print 'session_query:%s'% session_query.interface_group_name
        print 'session_query:%s' % session_query.interface_group_file
    return u'查询成功'

#数据库数据修改
@app.route('/db_modify/')
def db_modify():
    #先进行查询
    result = Interface_test.query.filter(Interface_test.interface_group_id == 1).first()
    #针对查询结果进行更新
    result.interface_group_name = 'login_new_modify'
    #进行事务提交
    db.session.commit()
    print result

    print 'interface_group_name:%s'% result.interface_group_name
    print 'interface_group_file:%s'% result.interface_group_file
    return u'查询成功'

#数据库数据修改
@app.route('/db_delete/')
def db_delete():
    #先进行查询
    result = Interface_test.query.filter(Interface_test.interface_group_id == 2).first()
    #针对查询结果进行更新
    db.session.delete(result)
    #进行事务提交
    db.session.commit()
    print result
    return u'查询成功'

#get请求
@app.route('/get_method')
def get_method():
    get_parame = ''
    return render_template('login4.html')
@app.route('/get_method_response')
def get_method_response():
    #获取用户传入的参数
    user_param = request.args.get('get_para')
    return u'get请求结果 :%s' % user_param

#get post请求
#默认的视图函数只采用get请求，如果需要使用post，需要表名
@app.route('/get_post/',methods=['GET','POST'])
def get_post():
    if request.method == 'GET':
        return render_template('login4.html')
    else:
        username = request.form.get('username')
        password = request.form.get('password')
        print 'username: %s' % username
        print 'password: %s' % password
        return 'testpass'


if __name__ == '__main__':
    # app.run() 启动一个应用服务器去监听用户的请求，循环监听
    #debug 模式，可以不用重启之间修改在界面长查看验证
    #debug 模式 可以直接在页面中看到错误信息和出错的位置
    app.run()
